//package qf.common.security.controller;
//
//import com.alibaba.fastjson2.JSONObject;
//import org.springframework.security.authentication.AuthenticationManager;
//import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.context.SecurityContextHolder;
//import org.springframework.web.bind.annotation.*;
//import qf.common.core.web.vo.AjaxResult;
//import qf.common.redis.constant.RedisConstant;
//import qf.common.redis.utils.RedisUtil;
//import qf.common.security.vo.SecuriyUserDetailVO;
//import qf.common.security.entitiy.SysUser;
//import qf.common.security.service.SysUserService;
//import qf.common.security.utils.JwtUtil;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Objects;
//
//@RestController
//@RequestMapping("/sysuser")
//public class LoginController {
//
//    @Resource
//    private AuthenticationManager authenticationManager;
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    @Resource
//    private SysUserService userService;
//
//    @PostMapping("/oauth")
//    public AjaxResult oAuth(@RequestBody SysUser user) {
//        if (user.getBusiNo() != null && user.getSecretkey() != null) {
//            // 补全内容
//            AjaxResult result = userService.loginUserByBusiNoAndSecretkey(user.getBusiNo(),user.getSecretkey());
//
//            if (!result.isSuccess()) {
//                return AjaxResult.error(result.getResultMsg());
//            }
//        }
//        Authentication authenticate;
//        try {
//            //使用Authentication的实现类
//            Authentication authentication = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
//            //手动调用方法去认证 他会自动调用UserDetailsService查 然后对比啥的
//            authenticate = authenticationManager.authenticate(authentication);
//        }catch (Exception e) {
//            return AjaxResult.error("用户名或密码错误");
//        }
//        //拿到用户信息 然后生成jwt返回给前端，并且将用户的信息存入redis
//        try {
//            SecuriyUserDetailVO securiyUserDetailVO = (SecuriyUserDetailVO) authenticate.getPrincipal(); // 这个其实就是UserDetails 也就是LoginUser
//            String userId = securiyUserDetailVO.getUser().getId().toString();
//
//            Map<String, String> map = new HashMap<>();
//            String jwt = JwtUtil.createJWT(userId);
//
//            redisUtil.set(RedisConstant.USER_LOGIN_KEY+ userId, JSONObject.toJSONString(securiyUserDetailVO),RedisConstant.OAUTH_TOKEN_EXPIRE_TIME);//将用户信息直接存入redis 2小时
//
//            map.put("token", jwt);
//
//            return AjaxResult.success(map);
//        }catch (Exception e) {
//            return AjaxResult.error("系统异常,请稍后再试");
//        }
//
//
//    }
//
//    @PostMapping("/login")
//    public AjaxResult login(@RequestBody SysUser user) {
//        Authentication authenticate;
//        try {
//            //使用Authentication的实现类
//            Authentication authentication = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
//            //手动调用方法去认证 他会自动调用UserDetailsService查 然后对比啥的
//            authenticate = authenticationManager.authenticate(authentication);
//        }catch (Exception e) {
//            return AjaxResult.error("用户名或密码错误");
//        }
//        //拿到用户信息 然后生成jwt返回给前端，并且将用户的信息存入redis
//        try {
//            SecuriyUserDetailVO securiyUserDetailVO = (SecuriyUserDetailVO) authenticate.getPrincipal(); // 这个其实就是UserDetails 也就是LoginUser
//            String userId = securiyUserDetailVO.getUser().getId().toString();
//
//            Map<String, String> map = new HashMap<>();
//            String jwt = JwtUtil.createJWT(userId);
//
//            redisUtil.set(RedisConstant.USER_LOGIN_KEY+ userId, JSONObject.toJSONString(securiyUserDetailVO),RedisConstant.OAUTH_TOKEN_EXPIRE_TIME);//将用户信息直接存入redis 2小时
//
//            map.put("token", jwt);
//
//            return AjaxResult.success(map);
//        }catch (Exception e) {
//            return AjaxResult.error("系统异常,请稍后再试");
//        }
//
//
//    }
//
//    @PostMapping("/logout")
//    public AjaxResult logout(){
//        //因为这个方法 是通过了jwt过滤器执行到这里的 所以SecurityContextHolder上下文是一样的
//        SecuriyUserDetailVO securiyUserDetailVO = (SecuriyUserDetailVO) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//        //拿到用户id删除redis中的数据
//        String userId  = securiyUserDetailVO.getUser().getId().toString();
//        if (redisUtil.del(RedisConstant.USER_LOGIN_KEY +userId)) {
//            return AjaxResult.success();
//        } else {
//            return AjaxResult.error();
//        }
//    }
//
//    @PostMapping("/save")
//    public AjaxResult save(@RequestBody JSONObject sysUser, HttpServletRequest request){
//        Long userId = JwtUtil.getAuthorizationUserIdByHeader(request);
//        sysUser.put("parentId",userId);
//        return userService.save(sysUser);
//    }
//
//}
//
